home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / glibc-1.09 / glibc-1 / glibc-1.09.1 / sysdeps / standalone / __open.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-26  |  2.7 KB  |  125 lines

  1. /* Copyright (C) 1994 Free Software Foundation, Inc.
  2.    Ported to standalone by Joel Sherrill jsherril@redstone-emh2.army.mil,
  3.      On-Line Applications Research Corporation.
  4.  
  5. This file is part of the GNU C Library.
  6.  
  7. The GNU C Library is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU Library General Public License as
  9. published by the Free Software Foundation; either version 2 of the
  10. License, or (at your option) any later version.
  11.  
  12. The GNU C Library is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. Library General Public License for more details.
  16.  
  17. You should have received a copy of the GNU Library General Public
  18. License along with the GNU C Library; see the file COPYING.LIB.  If
  19. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  20. Cambridge, MA 02139, USA.  */
  21.  
  22. #include <ansidecl.h>
  23. #include <errno.h>
  24. #include <fcntl.h>
  25. #include <stdarg.h>
  26. #include <stddef.h>
  27.  
  28. #include <stdio.h>
  29. #include <stdio_lim.h>
  30. #include <unistd.h>
  31.  
  32. #define __DECLARE_FILE_DESCRIPTORS__
  33.  
  34. #include "filedesc.h"
  35.  
  36. /* Open FILE with access OFLAG.  If OFLAG includes O_CREAT,
  37.    a third argument is the file protection.  */
  38. int
  39. DEFUN(__open, (file, oflag), CONST char *file AND int oflag DOTS)
  40. {
  41.   int mode;
  42.   int newfd;
  43.   int index;
  44.  
  45.   if (file == NULL)
  46.     {
  47.       errno = EINVAL;
  48.       return -1;
  49.     }
  50.  
  51.   if (oflag & O_CREAT)
  52.     {
  53.       va_list arg;
  54.       va_start(arg, oflag);
  55.       mode = va_arg(arg, int);
  56.       va_end(arg);
  57.     }
  58.  
  59.   /*
  60.    *  Find an open slot.
  61.    */
  62.  
  63.   newfd = -1;
  64.  
  65.   for ( index=0 ; index< FOPEN_MAX ; index++ )
  66.     if ( !__FD_Table[ index ].in_use ) {
  67.       newfd = index;
  68.       break;
  69.     }
  70.  
  71.   if ( newfd == -1 ) {
  72.     errno = ENFILE;
  73.     return -1;
  74.   }
  75.  
  76.   /* 
  77.    *  Initialize the open slot
  78.    */
  79.  
  80.   __FD_Table[ newfd ].in_use = 1;
  81.   __FD_Table[ newfd ].flags = oflag;
  82.   
  83.   return newfd;
  84. }
  85.  
  86. /* Initialization Code for Console I/O */
  87.  
  88. #ifdef HAVE_GNU_LD
  89. static
  90. #endif
  91. void
  92. DEFUN(__NONE_init_console_io, (argc, argv, envp),
  93.       int argc AND char **argv AND char **envp)
  94. {
  95.   int index;
  96.  
  97.   for ( index=0 ; index< FOPEN_MAX ; index++ )
  98.     __FD_Table[ index ].in_use = 0;
  99.  
  100.   stdin = fopen( "", "r" );
  101.  
  102.   stdout = fopen( "", "w" );
  103.  
  104.   stderr = fopen( "", "w" );
  105.  
  106.   /*
  107.    *  Line buffer the standard input and output and use no buffering for
  108.    *  standard error.
  109.    */
  110.  
  111.   setvbuf( stdin,  NULL, _IOLBF, BUFSIZ );
  112.   setvbuf( stdout, NULL, _IOLBF, BUFSIZ );
  113.   setvbuf( stderr, NULL, _IONBF, BUFSIZ );
  114.  
  115.   (void) &__NONE_init_console_io;  /* Avoid "defined but not used" warning. */
  116. }
  117.  
  118. #ifdef  HAVE_GNU_LD
  119.  
  120. #include <gnu-stabs.h>
  121.  
  122. text_set_element (__libc_subinit, __NONE_init_console_io);
  123.  
  124. #endif
  125.